package es.udc.fbellas.j2ee.tiendaweb.model.propiedad.DAO;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import es.udc.fbellas.j2ee.tiendaweb.model.propiedad.TO.PropiedadTO;
import es.udc.fbellas.j2ee.util.configuration.ConfigurationParametersManager;
import es.udc.fbellas.j2ee.util.exceptions.InternalErrorException;
import es.udc.fbellas.j2ee.util.sql.GeneralOperations;
import es.udc.fbellas.j2ee.util.sql.SimpleDataSource;

/**
 * A factory to get <code>SQLPropiedadDAO</code> objects.
 * <p>
 * Required configuration parameters:
 * <ul>
 * <li><code>SQLPropiedadDAOFactory/daoClassName</code>: it must specify the full
 * class name of the class implementing <code>SQLPropiedadDAO</code>.</li>
 * </ul>
 */
public class SQLPropiedadDAOFactory {

    private final static String DAO_CLASS_NAME_PARAMETER =
        "SQLPropiedadDAOFactory/daoClassName";

    private final static Class daoClass = getDAOClass();
    
    private SQLPropiedadDAOFactory() {}
    
    private static Class getDAOClass() {
    
        Class theClass = null;
    
        try {
        
            String daoClassName = ConfigurationParametersManager.getParameter(DAO_CLASS_NAME_PARAMETER);
            
            theClass = Class.forName(daoClassName);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return theClass;
        
    }
    
    public static SQLPropiedadDAO getDAO() throws InternalErrorException {
        
        try {        
            return (SQLPropiedadDAO) daoClass.newInstance();
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
        
    }
    
    /* 
     * Test code. Uncomment for testing. Test this class and any class
     * implementing "SQLPropiedadDAO".
     */         
    public static void main (String[] args) {    
        
        Connection connection = null;
    
        try {        
            
            /* Get a connection. */
            DataSource dataSource = new SimpleDataSource();
            connection = dataSource.getConnection();        
                    
//            /* Get dao. */
            SQLPropiedadDAO dao = SQLPropiedadDAOFactory.getDAO();
//
//            /* Test "SQLPropiedadDAO::find". */
            int idPropiedad=92846;
            System.out.println("Test for 'SQLPropiedadDAO::find'");
            PropiedadTO propiedadTO1 = dao.find(connection, 92846);
             System.out.println("propiedadTO1 find => " + propiedadTO1);
            
            /* Test "SQLPropiedadDAO::exists". */
            System.out.println("Test for 'SQLPropiedadDAO::exists'");
            if (!dao.exists(connection, propiedadTO1.getIdPropiedad())) {
                throw new Exception("Can not find propiedad with " +
                    "idPropiedad = " + 
                    propiedadTO1.getIdPropiedad());
            }
            
            /* Test "SQLPropiedadDAO::findbyproducto". */
            System.out.println("Test for 'SQLPropiedadDAO::findbyproducto'");
		    List<PropiedadTO> listProp = new ArrayList<PropiedadTO>();           
			listProp=dao.findbyproducto(connection,98345,1,2);
			int cont = 0;
			do{
				System.out.println("List<PropiedadTO> findbyproducto => "+ listProp.get(cont));
				cont++;
				}while ((cont+1)<listProp.size());        


            /* Tests OK. */
            System.out.println("Tests OK !!!!");
        
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                GeneralOperations.closeConnection(connection);
            } catch (InternalErrorException e) {
                e.printStackTrace();
            }
        }
                
    }    
    
}
